#ifndef __COMMAND_H
#define __COMMAND_H

#ifndef NULL
	#define NULL	0
#endif

#ifndef	__ASSEMBLY__
/*
 * Monitor Command Table
 */

	struct cmd_tbl_s {
		char	*name;			/* Command Name			*/
		int		maxargs;		/* maximum number of arguments	*/
		int		repeatable;	/* autorepeat allowed?		*/
		/* Implementation function	*/
		int		(*cmd)(struct cmd_tbl_s *, int, int, char *[]);
		char		*usage;		/* Usage message	(short)	*/
	#ifdef	CFG_LONGHELP
		char		*help;		/* Help  message	(long)	*/
	#endif
	#ifdef	CONFIG_AUTO_COMPLETE
		/* do auto completion on the arguments */
		int		(*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
	#endif
	};

	typedef struct cmd_tbl_s	cmd_tbl_t;

	extern cmd_tbl_t  *(__boot_cmd_start);
	extern cmd_tbl_t  *(__boot_cmd_end);


	/* common/command.c */
	cmd_tbl_t *find_cmd(const char *cmd);

	#ifdef CONFIG_AUTO_COMPLETE
		extern void install_auto_complete(void);
		extern int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp);
	#endif

	/*
	 * Monitor Command
	 * All commands use a common argument format:
	 * void function (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
	 */

	typedef	void 	command_t (cmd_tbl_t *, int, int, char *[]);

#endif	/* __ASSEMBLY__ */

/*
 * Command Flags:
 */
#define CMD_FLAG_REPEAT		0x0001	/* repeat last command		*/
#define CMD_FLAG_BOOTD		0x0002	/* command is from bootd	*/

/*
 * Configurable monitor commands definitions have been moved
 * to include/cmd_confdefs.h
 */

#define Struct_Section  __attribute__ ((unused, section (".boot_cmd")))

#ifdef  CFG_LONGHELP

	#define BOOT_CMD(name, maxargs, rep, cmd, usage, help) \
			cmd_tbl_t __boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}

#else	/* no long help info */

	#define BOOT_CMD(name, maxargs, rep, cmd, usage, help) \
		cmd_tbl_t __boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage}

#endif	/* CFG_LONGHELP */

#endif	/* __COMMAND_H */
